package controller;

import controller.dialog.Load;
import interfaces.PlayJogador;
import java.io.IOException;
import java.net.URL;
import java.rmi.AccessException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javafx.application.Platform;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.control.ColorPicker;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.paint.Color;
import model.TAGS;
import prjbancoimobilitariocliente.PrjBancoImobilitarioCliente;

/**
 * Controlle que realiza o cadastro do jogador ao servidor
 *
 * @author Adriano
 */
public class CadastroController implements Initializable {
    @FXML
    private TextField editName;
    @FXML
    private ColorPicker color;
    @FXML
    private static Label labelName;
    @FXML
    private Label labelColor;

    /**
     * Listiner do button iniciar. Ele inicia o cadastro ao servidor.
     */
    @FXML
    private void sendCadastrar(ActionEvent event) throws IOException {
        if (validarCampos()) {
            Thread cadastro = new Thread(new Cadastro());
            cadastro.start();
            Load.getLoad().getSage().show();
        }
    }

    /**
     * Listener voltar para a tela de inicio.
     */
    @FXML
    public void voltar(ActionEvent event) throws IOException {
        Parent root = FXMLLoader.load(getClass().getResource("/view/jogador/Index.fxml"));
        PrjBancoImobilitarioCliente.getInstace().setStage(root);
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        /*Setar uma lista de cores padrão*/
        List<Color> colors = new ArrayList<Color>();
        colors.add(Color.RED);
        colors.add(Color.BLUE);
        colors.add(Color.BLACK);
        colors.add(Color.ORANGE);
        colors.add(Color.GREEN);
        colors.add(Color.CHOCOLATE);
        colors.add(Color.AQUA);
        color.getCustomColors().setAll(colors);
        color.setPickOnBounds(false);
    }

    /**
     * Método que valida os campos do formulario.
     */
    private boolean validarCampos() {
        boolean chave = true;
        String name = editName.getText();
        labelName.setText("");
        labelColor.setText("");
        if (name.length() < 5 || name.length() > 10) {
            labelName.setText("Nome Inválido! Minimo 5 máximo 10 letras.");
            chave = false;
        }
        Color c = Color.web("0xffffffff");
        if (color.getValue().equals(c)) {
            labelColor.setText("Cor Inválida!");
            chave = false;
        }
        return chave;
    }

    /**
     * Tarefa que realiza o cadastro do jogador com o servidor.
     */
    public class Cadastro extends Task<Void> {

        private String str = "";

        @Override
        protected Void call(){
            try{
                Registry r = LocateRegistry.getRegistry(TAGS.SERVER_HOST, TAGS.PORT);
                PlayJogador playJogador = (PlayJogador) r.lookup("servidorJogador");
                str = playJogador.cadastrarJogador(editName.getText(), color.getValue().toString());
            } catch (NotBoundException ex) {
                str = "O servidor não está disponivel!";
            } catch (AccessException ex) {
                str = "O servidor não está disponivel!";
            }catch(RemoteException exception){
                str = "O servidor não está disponivel!";
            }
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        if (str.equals(TAGS.OK)) {
                            TAGS.NAME = editName.getText().trim();
                            Parent root = FXMLLoader.load(getClass().getResource("/view/jogador/Confirmar.fxml"));
                            PrjBancoImobilitarioCliente.getInstace().setStage(root);
                        }
                    } catch (Exception e) {
                        
                    }
                    labelName.setText(str);
                    Load.getLoad().getSage().close();
                }
            });
            return null;
        }
    }
}
